const errorCode = {
    '401': '认证失败，无法访问系统资源',
    '403': '当前操作没有权限',
    '404': '访问资源不存在',
    'default': '系统未知错误，请反馈给管理员'
}
axios.defaults.timeout = 10 * 1000; // 设置请求超时 10s
axios.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8"; // post 请求头

// 根据不同环境更改不同 baseUrl
axios.defaults.baseURL = config.BASE_URL[config.ENV]

// 添加请求拦截器
axios.interceptors.request.use(
    function (config) {
        // 在发送请求之前做些什么
        let tokenInfo = storage.get('fast-token');
        // header传入token，对于sa-token而言，其实是不需要的，只是为了写全套
        if (tokenInfo) {
            config.headers[tokenInfo.tokenName] = tokenInfo.tokenValue
        }
        return config;
    },
    function (error) {
        // 对请求错误做些什么
        return Promise.reject(error);
    }
);

// 添加响应拦截器
axios.interceptors.response.use(
    function (response) {
        // 全局响应拦截
        // 未设置状态码则默认成功状态
        const code = response.data.code || 200;
        // 获取错误信息
        const msg = errorCode[code] || response.data.msg || errorCode['default']
        // 二进制数据则直接返回
        if (response.request.responseType === 'blob' || response.request.responseType === 'arraybuffer') {
            return response.data
        }
        if (code === 401) {
            Vue.prototype.$msgbox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
                    confirmButtonText: '重新登录',
                    cancelButtonText: '取消',
                    type: 'warning'
                }
            ).then(() => {
                // todo 此处需要修改，不需要使用vuex
                store.dispatch('LogOut').then(() => {
                    location.href = '/index';
                })
            }).catch(() => {
            });
            return Promise.reject('无效的会话，或者会话已过期，请重新登录。')
        } else if (code === 500) {
            Vue.prototype.$message({
                message: msg,
                type: 'error'
            })
            return Promise.reject(new Error(msg))
        } else if (code !== 200) {
            Vue.prototype.$notify.error({
                title: msg
            })
            return Promise.reject('error')
        }
        // 对响应数据做点什么
        return response.data;
    },
    function (error) {
        // 对响应错误做点什么
        if (error && error.response) {
            switch (error.response.status) {
                case 400:
                    this.$message.error("请求错误(400)");
                    break;
                case 401:
                    this.$message.error("未授权，请重新登录(401)");
                    break;
                case 403:
                    this.$message.error("拒绝访问(403)");
                    break;
                case 404:
                    this.$message.error("请求出错(404)");
                    break;
                case 408:
                    this.$message.error("请求超时(408)");
                    break;
                case 500:
                    this.$message.error("服务器错误(500)");
                    break;
                case 501:
                    this.$message.error("服务未实现(501)");
                    break;
                case 502:
                    this.$message.error("网络错误(502)");
                    break;
                case 503:
                    this.$message.error("服务不可用(503)");
                    break;
                case 504:
                    this.$message.error("网络超时(504)");
                    break;
                case 505:
                    this.$message.error("HTTP版本不受支持(505)");
                    break;
                default:
                    this.$message.error("连接出错(" + error.response.status + ")!");
            }
        } else {
            Vue.prototype.$message({
                type: 'error',
                message: '连接服务器失败!'
            });
        }
        return Promise.reject(error);
    }
);

/**
 * 封装 get() 请求
 * get()方法，对应 axios.get()请求
 * url [请求的url地址]
 * params [请求时携带的参数]
 */
function $get(url, params) {
    return new Promise((resolve, reject) => {
        axios
            .get(url, {
                params: params,
            })
            .then((res) => {
                resolve(res.data);
            })
            .catch((err) => {
                reject(err);
            });
    });
}

/**
 * 封装 post() 请求
 * post()方法，对应 axios.post()请求
 * url [请求的url地址]
 * params [请求时携带的参数]
 */
function $post(url, params) {
    return new Promise((resolve, reject) => {
        axios
            .post(url, JSON.stringify(params),{
                headers: {
                    "Content-Type": "application/json;charset=utf-8"
                }})
            .then((res) => {
                resolve(res.data);
            })
            .catch((err) => {
                reject(err);
            });
    });
}

/**
 * 封装 post() 文件请求
 * post()方法，对应 axios.post()请求
 * url [请求的url地址]
 * params [请求时携带的参数]
 */
function file(url, params) {
    return new Promise((resolve, reject) => {
        let config = {
            headers: { "Content-Type": "multipart/form-data" },
        }; //添加请求头
        axios
            .post(url, params, config)
            .then((res) => {
                resolve(res.data);
            })
            .catch((err) => {
                reject(err);
            });
    });
}